#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct Postion
{
    int row;
    int col;
    Postion(int x, int y) :row(x), col(y)
    {}
};

stack<Postion> Path; //记录通路的路径下标位置
//输出路径上的坐标 起点->终点
void PrintPath()
{
    //将Path栈中的内容倒置才是输出顺序
    stack<Postion> rPath;
    while (!Path.empty())
    {
        rPath.push(Path.top());
        Path.pop();
    }
    //按格式输出内容
    while (!rPath.empty())
    {
        Postion top = rPath.top();
        printf("(%d,%d)\n", top.row, top.col);
        rPath.pop();
    }
}
//判断能否往pos位置走
bool IsPass(vector<vector<int>>& vv, Postion& pos)
{
    //获取迷宫的行和列
    int N = vv.size();
    int M = vv[0].size();
    //pos位置合法&&pos位置的值是0才是通路，才是可以往pos位置走
    //位置合法：位置的行>=0 && 位置的行<row && 位置的列>=0 && 位置的列<col
    if (pos.row >= 0 && pos.row < N && pos.col >= 0 && pos.col < M
        && vv[pos.row][pos.col] == 0)
        return true;
    else
        return false;
}
//从cur位置开始往四个方向进行搜索，找通路
bool GetMazePath(vector<vector<int>>& vv, Postion cur)
{
    Path.push(cur);//先把当前位置放到路径栈当中
    int N = vv.size();
    int M = vv[0].size();
    if (cur.row == N - 1 && cur.col == M - 1)//判断是否走到出口
        return true;

    vv[cur.row][cur.col] = 2;//把当前位置置成2,或者其它数字也可以，表示已经走过了！

    //往四个方向进行探测，顺序任意，因为答案唯一
    Postion nextUp{ cur.row - 1,cur.col };
    Postion nextDown{ cur.row + 1, cur.col };
    Postion nextLeft{ cur.row, cur.col - 1 };
    Postion nextRight{cur.row, cur.col + 1};

    //先判断能否往该方向走，如果能才往该方向进行下一步探索
    //只要任一方向的探测走到出口就返回真
    if (IsPass(vv, nextUp))//上
    {
        if (GetMazePath(vv, nextUp))
            return true;
    }
    if (IsPass(vv, nextDown))//下
    {
        if (GetMazePath(vv, nextDown))
            return true;
    }
    if (IsPass(vv, nextLeft))//左
    {
        if (GetMazePath(vv, nextLeft))
            return true;
    }
    if (IsPass(vv, nextRight))//右
    {
        if (GetMazePath(vv, nextRight))
            return true;
    }

    //来到这里，说明当前位置往四个方向走都不能得到通路
    Path.pop();//当前位置不是路径上的位置
    return false;
}
int main()
{
    int N, M;
    while (cin >> N >> M)
    {
        vector<vector<int>> maze(N, vector<int>(M));
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++)
                cin >> maze[i][j];

        Postion start{ 0,0 };//起点位置
        if (GetMazePath(maze, start))//从起点位置开始探索找通路
        {
            //找到通路了，输出路径
            PrintPath();
        }
        else
        {
            //没有通路，题目已经说明有唯一解，所以不可能走这里
            cout << "没有通路" << endl;
        }
    }

    return 0;
}
// #include<iostream>
// using namespace std;
// int main()
// {
//     double tmp;
//     double sum = 0;
//     while(1)
//     {
//         if(tmp == -1)
//             break;
//         cout << "输入: ";
//         cin >> tmp;
//         sum += tmp;
//     }
//     cout << sum << endl;
//     return 0;
// }